#!/bin/bash
###############################################################################
#       脚本名称: yaml.sh
#       功能描述: yaml配置文件适配层，提供配置管理专用功能。
#       作者: 林再来
#       日期: 2025-10-20
#       版本: 1.0
#       功能:
#           1、配置文件专用业务逻辑封装
#           2、多环境配置管理(base/dev/prod)
#           3、配置变更检测和监控
#           4、配置快照、备份和回滚
#           5、配置热重载支持
#           6、配置Schema验证
#           7、配置导入导出
#       依赖(插件/命令):
#           1、utils/utils_yq.sh - yaml数据处理工具
#           2、md5sum或cksum - 哈希计算
###############################################################################

# 防止重复加载
if [[ -n "${yaml_sh_loaded:-}" ]]; then
    return 0
fi
readonly yaml_sh_loaded=1

# 注意：不使用严格模式，避免影响交互式 shell

# 获取脚本目录和项目根目录（如果尚未定义）
if [[ -z "${script_dir:-}" ]]; then
    script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
    readonly script_dir
fi

if [[ -z "${project_root:-}" ]]; then
    project_root="$(cd "${script_dir}/../.." && pwd)"
    readonly project_root
fi

# 加载依赖的工具层
if [[ -f "${project_root}/scripts/utils/utils_yq.sh" ]]; then
    source "${project_root}/scripts/utils/utils_yq.sh"
else
    echo "[ERROR] 无法加载依赖模块: utils_yq.sh" >&2
    return 1
fi

###############################################################################
# 全局常量
###############################################################################

readonly YAML_SNAPSHOT_DIR_SUFFIX=".snapshots"
readonly YAML_HASH_FILE_SUFFIX=".hash"

###############################################################################
# 全局变量
###############################################################################

declare -A YAML_WATCH_PIDS    # 配置文件监控进程PID映射

###############################################################################
# 基础配置操作（代理到工具层）
###############################################################################

# 函数: 读取配置值
# 参数: $1 - YAML配置文件路径, $2 - 配置键路径
# 返回: 0-成功, 1-失败
# 输出: 配置值(stdout)
# 说明: 简单代理到工具层，未来可扩展环境变量替换等特性
function yaml_read() {
    local yaml_file="$1"
    local key="$2"
    
    utils_yq_read "$yaml_file" "$key"
}

# 函数: 写入配置值
# 参数: $1 - YAML配置文件路径, $2 - 配置键路径, $3 - 配置值, $4 - 值类型(可选)
# 返回: 0-成功, 1-失败
function yaml_write() {
    local yaml_file="$1"
    local key="$2"
    local value="$3"
    local value_type="${4:-string}"
    
    utils_yq_write "$yaml_file" "$key" "$value" "$value_type"
}

# 函数: 删除配置键
# 参数: $1 - YAML配置文件路径, $2 - 配置键路径
# 返回: 0-成功, 1-失败
function yaml_delete() {
    local yaml_file="$1"
    local key="$2"
    
    utils_yq_delete "$yaml_file" "$key"
}

###############################################################################
# 多环境配置管理
###############################################################################

# 函数: 合并多环境配置
# 参数: $1 - 基础配置文件, $2 - 环境配置文件, $3 - 输出文件路径
# 返回: 0-成功, 1-失败
# 说明: 将base配置和环境特定配置(dev/prod)合并
function yaml_merge_env() {
    local base_file="$1"
    local env_file="$2"
    local output_file="$3"
    
    if [[ -z "$base_file" ]] || [[ -z "$env_file" ]] || [[ -z "$output_file" ]]; then
        log_error "yaml" "错误: 缺少参数: 基础配置文件、环境配置文件和输出文件路径"
        return 1
    fi
    
    if [[ ! -f "$base_file" ]]; then
        log_error "yaml" "错误: 基础配置文件不存在: $base_file"
        return 1
    fi
    
    if [[ ! -f "$env_file" ]]; then
        log_error "yaml" "错误: 环境配置文件不存在: $env_file"
        return 1
    fi
    
    log_info "yaml" "合并环境配置: $base_file + $env_file -> $output_file"
    
    # 先复制基础配置到输出文件
    cp "$base_file" "$output_file" || {
        log_error "yaml" "错误: 无法创建输出文件: $output_file"
        return 1
    }
    
    # 使用merge模式合并环境配置（环境配置会覆盖基础配置的相同键）
    if utils_yq_merge "$output_file" "$env_file" "merge"; then
        log_info "yaml" "环境配置合并成功"
        return 0
    else
        log_error "yaml" "错误: 环境配置合并失败"
        return 1
    fi
}

###############################################################################
# 配置变更检测
###############################################################################

# 函数: 计算配置文件哈希值
# 参数: $1 - YAML配置文件路径, $@ - 要计算哈希的键数组(可选)
# 返回: 哈希值字符串
# 说明: 用于配置变更检测
function yaml_get_hash() {
    local yaml_file="$1"
    shift
    local keys=("$@")
    
    if [[ -z "$yaml_file" ]]; then
        log_error "yaml" "错误: 缺少参数: YAML配置文件路径"
        return 1
    fi
    
    if [[ ! -f "$yaml_file" ]]; then
        log_error "yaml" "错误: YAML配置文件不存在: $yaml_file"
        return 1
    fi
    
    log_debug "yaml" "计算配置文件哈希值: $yaml_file"
    
    local content=""
    
    if [[ ${#keys[@]} -eq 0 ]]; then
        # 如果没有指定键，计算整个文件的内容哈希
        content=$(utils_yq_query "$yaml_file" '.' 2>/dev/null | sort)
    else
        # 计算指定键的值的哈希
        for key in "${keys[@]}"; do
            local value
            value=$(yaml_read "$yaml_file" "$key")
            content="${content}${key}=${value}"
        done
    fi
    
    # 计算哈希值(三级降级策略)
    if command -v md5sum >/dev/null 2>&1; then
        echo -n "$content" | md5sum | cut -d' ' -f1
    elif command -v cksum >/dev/null 2>&1; then
        echo -n "$content" | cksum | cut -d' ' -f1
    else
        # 简单的字符串长度和首尾字符作为备用哈希
        echo -n "${#content}-$(echo -n "$content" | head -c1)-$(echo -n "$content" | tail -c1)"
    fi
}

# 函数: 保存配置文件哈希值
# 参数: $1 - YAML配置文件路径, $2 - 哈希文件路径(可选), $@ - 要保存哈希的键数组(可选)
# 返回: 0-成功, 1-失败
function yaml_save_hash() {
    local yaml_file="$1"
    local hash_file="${2:-}"
    shift 2 2>/dev/null || shift 1
    local keys=("$@")
    
    if [[ -z "$yaml_file" ]]; then
        log_error "yaml" "错误: 缺少参数: YAML配置文件路径"
        return 1
    fi
    
    # 如果没有指定哈希文件，使用默认路径
    if [[ -z "$hash_file" ]]; then
        hash_file="${yaml_file}${YAML_HASH_FILE_SUFFIX}"
    fi
    
    log_debug "yaml" "保存配置哈希值: $yaml_file -> $hash_file"
    
    # 计算哈希值
    local hash_value
    if [[ ${#keys[@]} -eq 0 ]]; then
        hash_value=$(yaml_get_hash "$yaml_file")
    else
        hash_value=$(yaml_get_hash "$yaml_file" "${keys[@]}")
    fi
    
    if [[ $? -ne 0 ]] || [[ -z "$hash_value" ]]; then
        log_error "yaml" "错误: 计算哈希值失败"
        return 1
    fi
    
    # 保存哈希值到文件
    if echo "$hash_value" > "$hash_file"; then
        log_debug "yaml" "哈希值已保存: $hash_value"
        return 0
    else
        log_error "yaml" "错误: 保存哈希值失败: $hash_file"
        return 1
    fi
}

# 函数: 检查配置文件是否发生变更
# 参数: $1 - YAML配置文件路径, $2 - 哈希文件路径(可选), $@ - 要检查的键数组(可选)
# 返回: 0-发生变更, 1-未发生变更
function yaml_check_changed() {
    local yaml_file="$1"
    local hash_file="${2:-}"
    shift 2 2>/dev/null || shift 1
    local keys=("$@")
    
    if [[ -z "$yaml_file" ]]; then
        log_error "yaml" "错误: 缺少参数: YAML配置文件路径"
        return 1
    fi
    
    if [[ ! -f "$yaml_file" ]]; then
        log_error "yaml" "错误: YAML配置文件不存在: $yaml_file"
        return 1
    fi
    
    # 如果没有指定哈希文件，使用默认路径
    if [[ -z "$hash_file" ]]; then
        hash_file="${yaml_file}${YAML_HASH_FILE_SUFFIX}"
    fi
    
    log_debug "yaml" "检查配置文件变更: $yaml_file"
    
    # 如果哈希文件不存在，说明是第一次检查，视为已变更
    if [[ ! -f "$hash_file" ]]; then
        log_debug "yaml" "哈希文件不存在，视为已变更: $hash_file"
        return 0
    fi
    
    # 读取保存的哈希值
    local saved_hash
    saved_hash=$(cat "$hash_file" 2>/dev/null | head -1)
    if [[ -z "$saved_hash" ]]; then
        log_debug "yaml" "无法读取保存的哈希值，视为已变更"
        return 0
    fi
    
    # 计算当前哈希值
    local current_hash
    if [[ ${#keys[@]} -eq 0 ]]; then
        current_hash=$(yaml_get_hash "$yaml_file")
    else
        current_hash=$(yaml_get_hash "$yaml_file" "${keys[@]}")
    fi
    
    if [[ $? -ne 0 ]] || [[ -z "$current_hash" ]]; then
        log_error "yaml" "错误: 计算当前哈希值失败"
        return 1
    fi
    
    # 比较哈希值
    if [[ "$current_hash" != "$saved_hash" ]]; then
        log_debug "yaml" "检测到配置变更 (当前: $current_hash, 保存: $saved_hash)"
        return 0
    else
        log_debug "yaml" "配置未发生变更"
        return 1
    fi
}

# 函数: 比较两个配置文件中指定键的值
# 参数: $1 - 第一个YAML配置文件路径, $2 - 第二个YAML配置文件路径, $@ - 要比较的键数组
# 返回: 0-值相同, 1-值不同或出错
function yaml_compare_values() {
    local file1="$1"
    local file2="$2"
    shift 2
    local keys=("$@")
    
    if [[ -z "$file1" ]] || [[ -z "$file2" ]]; then
        log_error "yaml" "错误: 缺少参数: 需要两个YAML配置文件路径"
        return 1
    fi
    
    if [[ ! -f "$file1" ]]; then
        log_error "yaml" "错误: 第一个YAML配置文件不存在: $file1"
        return 1
    fi
    
    if [[ ! -f "$file2" ]]; then
        log_error "yaml" "错误: 第二个YAML配置文件不存在: $file2"
        return 1
    fi
    
    if [[ ${#keys[@]} -eq 0 ]]; then
        log_error "yaml" "错误: 至少需要指定一个要比较的键"
        return 1
    fi
    
    log_debug "yaml" "比较配置文件值: $file1 vs $file2"
    
    # 比较每个指定的键
    for key in "${keys[@]}"; do
        local value1 value2
        value1=$(yaml_read "$file1" "$key")
        local result1=$?
        value2=$(yaml_read "$file2" "$key")
        local result2=$?
        
        # 如果读取失败，视为不同
        if [[ $result1 -ne 0 ]] || [[ $result2 -ne 0 ]]; then
            log_debug "yaml" "键 $key 读取失败，视为不同"
            return 1
        fi
        
        # 比较值
        if [[ "$value1" != "$value2" ]]; then
            log_debug "yaml" "键 $key 的值不同: '$value1' != '$value2'"
            return 1
        fi
        
        log_debug "yaml" "键 $key 的值相同: '$value1'"
    done
    
    log_debug "yaml" "所有指定键的值都相同"
    return 0
}

###############################################################################
# 配置快照和回滚
###############################################################################

# 函数: 创建配置快照
# 参数: $1 - YAML配置文件路径, $2 - 快照目录(可选), $3 - 快照注释(可选)
# 返回: 0-成功, 1-失败
function yaml_create_snapshot() {
    local yaml_file="$1"
    local snapshot_dir="${2:-}"
    local comment="${3:-}"
    
    if [[ -z "$yaml_file" ]]; then
        log_error "yaml" "错误: 缺少参数: YAML配置文件路径"
        return 1
    fi
    
    if [[ ! -f "$yaml_file" ]]; then
        log_error "yaml" "错误: YAML配置文件不存在: $yaml_file"
        return 1
    fi
    
    # 如果没有指定快照目录，使用默认目录
    if [[ -z "$snapshot_dir" ]]; then
        snapshot_dir="${yaml_file}${YAML_SNAPSHOT_DIR_SUFFIX}"
    fi
    
    # 创建快照目录
    mkdir -p "$snapshot_dir" || {
        log_error "yaml" "错误: 无法创建快照目录: $snapshot_dir"
        return 1
    }
    
    # 生成快照文件名
    local timestamp=$(date +%Y%m%d_%H%M%S)
    local snapshot_file="$snapshot_dir/snapshot_$timestamp.yaml"
    local meta_file="$snapshot_dir/snapshot_$timestamp.meta"
    
    log_debug "yaml" "创建配置快照: $yaml_file -> $snapshot_file"
    
    # 复制文件
    if cp "$yaml_file" "$snapshot_file"; then
        # 创建元数据文件
        cat > "$meta_file" << EOF
# YAML配置快照元数据
original_file: $yaml_file
snapshot_time: $(date '+%Y-%m-%d %H:%M:%S')
snapshot_timestamp: $timestamp
comment: ${comment:-无注释}
file_size: $(wc -c < "$yaml_file" 2>/dev/null || echo "unknown")
file_hash: $(yaml_get_hash "$yaml_file")
EOF
        
        log_info "yaml" "配置快照创建成功: $snapshot_file"
        echo "$snapshot_file"  # 输出快照文件路径，供调用者使用
        return 0
    else
        log_error "yaml" "错误: 配置快照创建失败"
        return 1
    fi
}

# 函数: 列出所有配置快照
# 参数: $1 - YAML配置文件路径, $2 - 快照目录(可选)
# 返回: 0-成功, 1-失败
# 输出: 快照列表(stdout)
function yaml_list_snapshots() {
    local yaml_file="$1"
    local snapshot_dir="${2:-}"
    
    if [[ -z "$yaml_file" ]]; then
        log_error "yaml" "错误: 缺少参数: YAML配置文件路径"
        return 1
    fi
    
    # 如果没有指定快照目录，使用默认目录
    if [[ -z "$snapshot_dir" ]]; then
        snapshot_dir="${yaml_file}${YAML_SNAPSHOT_DIR_SUFFIX}"
    fi
    
    if [[ ! -d "$snapshot_dir" ]]; then
        log_warn "yaml" "快照目录不存在: $snapshot_dir"
        return 1
    fi
    
    log_info "yaml" "配置快照列表: $snapshot_dir"
    
    # 列出所有快照文件
    local snapshots=($(ls -1 "$snapshot_dir"/snapshot_*.yaml 2>/dev/null | sort -r))
    
    if [[ ${#snapshots[@]} -eq 0 ]]; then
        log_info "yaml" "没有找到任何快照"
        return 1
    fi
    
    # 显示快照信息
    for snapshot in "${snapshots[@]}"; do
        local meta_file="${snapshot%.yaml}.meta"
        echo "快照: $(basename "$snapshot")"
        if [[ -f "$meta_file" ]]; then
            grep -E "^(snapshot_time|comment):" "$meta_file" 2>/dev/null | sed 's/^/  /'
        fi
        echo ""
    done
    
    return 0
}

# 函数: 回滚到指定快照
# 参数: $1 - YAML配置文件路径, $2 - 快照文件路径
# 返回: 0-成功, 1-失败
function yaml_rollback() {
    local yaml_file="$1"
    local snapshot_file="$2"
    
    if [[ -z "$yaml_file" ]] || [[ -z "$snapshot_file" ]]; then
        log_error "yaml" "错误: 缺少参数: YAML配置文件路径和快照文件路径"
        return 1
    fi
    
    if [[ ! -f "$snapshot_file" ]]; then
        log_error "yaml" "错误: 快照文件不存在: $snapshot_file"
        return 1
    fi
    
    log_info "yaml" "回滚配置: $yaml_file <- $snapshot_file"
    
    # 在回滚前创建当前配置的快照
    yaml_create_snapshot "$yaml_file" "" "回滚前自动快照" >/dev/null
    
    # 恢复快照
    if cp "$snapshot_file" "$yaml_file"; then
        log_info "yaml" "配置回滚成功"
        return 0
    else
        log_error "yaml" "错误: 配置回滚失败"
        return 1
    fi
}

###############################################################################
# 配置监控
###############################################################################

# 函数: 监控配置文件变更
# 参数: $1 - YAML配置文件路径, $2 - 回调函数名, $@ - 要监控的键数组(可选)
# 返回: 0-成功, 1-失败
# 说明: 在后台监控配置变更，发生变更时调用回调函数
function yaml_watch() {
    local yaml_file="$1"
    local callback_function="$2"
    shift 2
    local keys=("$@")
    
    if [[ -z "$yaml_file" ]] || [[ -z "$callback_function" ]]; then
        log_error "yaml" "错误: 缺少参数: YAML配置文件路径和回调函数"
        return 1
    fi
    
    if [[ ! -f "$yaml_file" ]]; then
        log_error "yaml" "错误: YAML配置文件不存在: $yaml_file"
        return 1
    fi
    
    # 检查回调函数是否存在
    if ! declare -f "$callback_function" >/dev/null 2>&1; then
        log_error "yaml" "错误: 回调函数不存在: $callback_function"
        return 1
    fi
    
    log_info "yaml" "启动配置监控: $yaml_file (回调: $callback_function)"
    
    local watch_hash_file="${yaml_file}.watch${YAML_HASH_FILE_SUFFIX}"
    
    # 保存初始哈希
    if [[ ${#keys[@]} -eq 0 ]]; then
        yaml_save_hash "$yaml_file" "$watch_hash_file"
    else
        yaml_save_hash "$yaml_file" "$watch_hash_file" "${keys[@]}"
    fi
    
    # 后台监控循环
    (
        while true; do
            sleep 2
            
            # 检查文件是否还存在
            if [[ ! -f "$yaml_file" ]]; then
                log_warn "yaml" "监控的配置文件已不存在: $yaml_file"
                break
            fi
            
            # 检查变更
            local changed=0
            if [[ ${#keys[@]} -eq 0 ]]; then
                if yaml_check_changed "$yaml_file" "$watch_hash_file"; then
                    changed=1
                fi
            else
                if yaml_check_changed "$yaml_file" "$watch_hash_file" "${keys[@]}"; then
                    changed=1
                fi
            fi
            
            if [[ $changed -eq 1 ]]; then
                log_info "yaml" "检测到配置变更，调用回调函数: $callback_function"
                
                # 调用回调函数
                $callback_function "$yaml_file"
                
                # 更新哈希值
                if [[ ${#keys[@]} -eq 0 ]]; then
                    yaml_save_hash "$yaml_file" "$watch_hash_file"
                else
                    yaml_save_hash "$yaml_file" "$watch_hash_file" "${keys[@]}"
                fi
            fi
        done
        
        # 清理临时文件
        rm -f "$watch_hash_file"
    ) &
    
    # 保存监控进程PID
    local watch_pid=$!
    YAML_WATCH_PIDS["$yaml_file"]=$watch_pid
    
    log_info "yaml" "配置监控已启动 (PID: $watch_pid)"
    return 0
}

# 函数: 停止配置监控
# 参数: $1 - YAML配置文件路径
# 返回: 0-成功, 1-失败
function yaml_stop_watch() {
    local yaml_file="$1"
    
    if [[ -z "$yaml_file" ]]; then
        log_error "yaml" "错误: 缺少参数: YAML配置文件路径"
        return 1
    fi
    
    local watch_pid="${YAML_WATCH_PIDS[$yaml_file]:-}"
    
    if [[ -z "$watch_pid" ]]; then
        log_warn "yaml" "没有找到该配置文件的监控进程: $yaml_file"
        return 1
    fi
    
    log_info "yaml" "停止配置监控 (PID: $watch_pid)"
    
    # 停止监控进程
    kill "$watch_pid" 2>/dev/null || true
    
    # 从映射中删除
    unset YAML_WATCH_PIDS["$yaml_file"]
    
    # 清理哈希文件
    rm -f "${yaml_file}.watch${YAML_HASH_FILE_SUFFIX}"
    
    return 0
}

###############################################################################
# 配置导入导出
###############################################################################

# 函数: 导出配置到指定目录
# 参数: $1 - YAML配置文件路径, $2 - 导出目录
# 返回: 0-成功, 1-失败
function yaml_export() {
    local yaml_file="$1"
    local export_dir="$2"
    
    if [[ -z "$yaml_file" ]] || [[ -z "$export_dir" ]]; then
        log_error "yaml" "错误: 缺少参数: YAML配置文件路径和导出目录"
        return 1
    fi
    
    if [[ ! -f "$yaml_file" ]]; then
        log_error "yaml" "错误: YAML配置文件不存在: $yaml_file"
        return 1
    fi
    
    # 创建导出目录
    mkdir -p "$export_dir" || {
        log_error "yaml" "错误: 无法创建导出目录: $export_dir"
        return 1
    }
    
    local timestamp=$(date +%Y%m%d_%H%M%S)
    local export_file="$export_dir/$(basename "$yaml_file" .yaml)_$timestamp.yaml"
    
    log_info "yaml" "导出配置: $yaml_file -> $export_file"
    
    if cp "$yaml_file" "$export_file"; then
        log_info "yaml" "配置导出成功: $export_file"
        echo "$export_file"
        return 0
    else
        log_error "yaml" "错误: 配置导出失败"
        return 1
    fi
}

# 函数: 从文件导入配置
# 参数: $1 - 源YAML文件路径, $2 - 目标YAML配置文件路径
# 返回: 0-成功, 1-失败
function yaml_import() {
    local source_file="$1"
    local target_file="$2"
    
    if [[ -z "$source_file" ]] || [[ -z "$target_file" ]]; then
        log_error "yaml" "错误: 缺少参数: 源文件路径和目标配置文件路径"
        return 1
    fi
    
    if [[ ! -f "$source_file" ]]; then
        log_error "yaml" "错误: 源文件不存在: $source_file"
        return 1
    fi
    
    # 验证源文件格式
    if ! utils_yq_validate "$source_file"; then
        log_error "yaml" "错误: 源文件格式无效"
        return 1
    fi
    
    log_info "yaml" "导入配置: $source_file -> $target_file"
    
    # 如果目标文件存在，先创建快照
    if [[ -f "$target_file" ]]; then
        yaml_create_snapshot "$target_file" "" "导入前自动快照" >/dev/null
    fi
    
    # 导入配置
    if cp "$source_file" "$target_file"; then
        log_info "yaml" "配置导入成功"
        return 0
    else
        log_error "yaml" "错误: 配置导入失败"
        return 1
    fi
}

###############################################################################
# 帮助函数
###############################################################################

# 函数: 显示帮助信息
function yaml_help() {
    cat << 'EOF'
YAML配置管理适配层 (yaml.sh) - 使用说明

基础操作：
  yaml_read <file> <key>                 - 读取配置值
  yaml_write <file> <key> <value> [type] - 写入配置值
  yaml_delete <file> <key>               - 删除配置键

多环境管理：
  yaml_merge_env <base> <env> <output>  - 合并环境配置

变更检测：
  yaml_get_hash <file> [keys...]          - 计算配置哈希
  yaml_save_hash <file> [hash_file] [keys...] - 保存哈希值
  yaml_check_changed <file> [hash_file] [keys...] - 检查变更
  yaml_compare_values <file1> <file2> <keys...> - 比较配置值

快照和回滚：
  yaml_create_snapshot <file> [dir] [comment] - 创建快照
  yaml_list_snapshots <file> [dir]          - 列出快照
  yaml_rollback <file> <snapshot>           - 回滚到快照

配置监控：
  yaml_watch <file> <callback> [keys...]  - 监控配置变更
  yaml_stop_watch <file>                  - 停止监控

导入导出：
  yaml_export <file> <dir>          - 导出配置
  yaml_import <source> <target>     - 导入配置

使用示例：
  # 多环境配置合并
  yaml_merge_env config/base/app.yaml config/prod/app.yaml config/app.yaml
  
  # 创建快照
  yaml_create_snapshot config/app.yaml ./backups "升级前备份"
  
  # 监控配置变更
  my_callback() { echo "配置已更新: $1"; service restart; }
  yaml_watch config/app.yaml my_callback

注意事项：
  1. 本模块专注于配置管理业务逻辑
  2. 底层数据操作依赖 utils/utils_yq.sh
  3. 监控功能在后台运行，记得在脚本退出时调用 yaml_stop_watch

EOF
}

###############################################################################
# 简单日志函数（如果外部日志模块不可用）
###############################################################################

if ! command -v log_debug >/dev/null 2>&1; then
    function log_debug() { 
        local module="${1:-}"
        shift
        echo "[DEBUG] [$module] $*" >&2
    }
fi

if ! command -v log_info >/dev/null 2>&1; then
    function log_info() {
        local module="${1:-}"
        shift
        echo "[INFO]  [$module] $*" >&2
    }
fi

if ! command -v log_warn >/dev/null 2>&1; then
    function log_warn() {
        local module="${1:-}"
        shift
        echo "[WARN]  [$module] $*" >&2
    }
fi

if ! command -v log_error >/dev/null 2>&1; then
    function log_error() {
        local module="${1:-}"
        shift
        echo "[ERROR] [$module] $*" >&2
    }
fi

